package com.cskaoyan.javase.oop3._2inner._0introduction;

/**
 * @description: 内部类的引入
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * > 引入
 * > 我们现在做一个应用程序，需要描述一台电脑（Computer）中的CPU，对于电脑而言
 * > 该怎么去描述这个CPU呢？
 *
 * - 它有存储设备，IO设备等等很多硬件资源组件
 * - CPU是电脑中最重要的组件
 *
 * 可以定义Cpu类,然后将其作为成员变量放在Computer类的成员列表当中,并且私有化,这么做看起来可以实现功能,但是有几个问题:
 *      1,CPU很重要,但是它脱离了计算机也没有任何意义,所以Cpu这个类应该不能在Computer类外部创建对象
 *      2,CPU很强大,可以控制计算机的一切硬件资源 --> Cpu应该可以访问Computer类的所有成员,包括私有
 *
 * 以上两点,定义一个独立的类Cpu都是完成不了的,所以可以考虑把Cpu类放入Computer类中,
 *      1,这样就可以让Cpu类变成Computer的私有,在外部就不能创建对象了
 *      2,现在Cpu类已经可以算做Computer类的"成员"了,是"自己人"了,所以访问不受限了(包括私有)
 *
 * 像这样把一个类放在另一个类的类体中定义,称之为"内部类",通过以上案例,我们可以总结(所有)内部类的特点:
 *      1,内部类是一种更加极致的封装思想体现,内部类的成员不仅被内部类自身保护,还被包裹内部类的那个类保护
 *      2,内部类和包裹它的类是"好兄弟",之间没有隐私,所有的成员都能访问,不受访问权限限制
 *
 * > 内部类的定义
 * - 在Java语言中类可以嵌套定义，内部类（inner class）是定义在另一类当中的类
 *
 * > 内部类的概述
 * - 按照内部类在类中定义的位置不同：
 *   - 定义在成员位置的内部类，称之为成员内部类，普通成员内部类，静态内部类(成员内部类基础上加static)
 *   - 定义在局部位置(主要是方法)的内部类，局部内部类，匿名内部类,lambda表达式
 * - 内部类是典型的，Java从C++中拿过来但是没有经过简化的特性
 *   - 也就是说Java几乎照搬了C++中的内部类
 *   - 通过内部类可以稍微感受一下C++的语法复杂性
 *
 * - 为了上课方便，我们需要统一口径，在内部类课程当中，我们统一规定
 *   - 像CPU这种类我们称之为内部类（inner class）
 *   - Computer这种类我们称之为外围类（enclosed class）
 *   - Demo这种类我们称之为外部类（outside class）
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        //Cpu c = new Cpu();
    }
}
//电脑类
class Computer{
    private Cpu c;
    private class Cpu{

    }
}
//外部独立的Cpu类
//class Cpu{
//}
